package org.zjframework.traceframe.common.service.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
















import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.zjframework.traceframe.common.dao.ICommonDao;
import org.zjframework.traceframe.common.model.DataGrid;
import org.zjframework.traceframe.common.service.ICommonService;
import org.zjframework.traceframe.common.util.PageBean;
import org.zjframework.traceframe.common.util.PageHelper;


@SuppressWarnings("unused")
@Service("commonService")
public class CommonServiceImpl implements ICommonService {
	public ICommonDao commonDao;
	/**
	 * 获取所有数据库表
	 * @return
	 */
//	public List<DBTable> getAllDbTableName()
//	{
//		return commonDao.getAllDbTableName();
//	}




	public ICommonDao getCommonDao() {
		return commonDao;
	}


	@Resource
	public void setCommonDao(ICommonDao commonDao) {
		this.commonDao = commonDao;
	}



	@Override
	public <T> void save(T entity) {
		commonDao.save(entity);
	}







	@Override
	public <T> void saveOrUpdate(T entity) {
		commonDao.saveOrUpdate(entity);

	}

	@Override
	public <T> void delete(T entity) {
		commonDao.delete(entity);

	}

	/**
	 * 删除实体集合
	 *
	 * @param <T>
	 * @param entities
	 */
	public <T> void deleteAllEntitie(Collection<T> entities) {
		commonDao.deleteAllEntitie(entities);
	}

	/**
	 * 根据实体名获取对象
	 */
	public <T> T get(Class<T> class1, Serializable id) {
		return commonDao.get(class1, id);
	}

	/**
	 * 根据实体名返回全部对象
	 *
	 * @param <T>
	 * @return
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public <T> List<T> getList(Class clas) {
		return commonDao.loadAll(clas);
	}

	/**
	 * 根据实体名获取对象
	 */
	@SuppressWarnings("rawtypes")
	public <T> T getEntity(Class entityName, Serializable id) {
		return commonDao.getEntity(entityName, id);
	}

	/**
	 * 根据实体名称和字段名称和字段值获取唯一记录
	 *
	 * @param <T>
	 * @param entityClass
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public <T> T findUniqueByProperty(Class<T> entityClass, String propertyName, Object value) {
		return commonDao.findUniqueByProperty(entityClass, propertyName, value);
	}

	/**
	 * 按属性查找对象列表.
	 */
	public <T> List<T> findByProperty(Class<T> entityClass, String propertyName, Object value) {

		return commonDao.findByProperty(entityClass, propertyName, value);
	}

	/**
	 * 加载全部实体
	 *
	 * @param <T>
	 * @param entityClass
	 * @return
	 */
	public <T> List<T> loadAll(final Class<T> entityClass) {
		return commonDao.loadAll(entityClass);
	}

	public <T> T singleResult(String hql)
	{
		return commonDao.singleResult(hql);
	}

	/**
	 * 删除实体主键ID删除对象
	 *
	 * @param <T>
	 */
	@SuppressWarnings("rawtypes")
	public <T> void deleteEntityById(Class entityName, Serializable id) {
		commonDao.deleteEntityById(entityName, id);
	}

	/**
	 * 更新指定的实体
	 *
	 * @param <T>
	 * @param pojo
	 */
	public <T> void updateEntitie(T pojo) {
		commonDao.updateEntitie(pojo);

	}

	/**
	 * 通过hql 查询语句查找对象
	 *
	 * @param <T>
	 * @return
	 */
	public <T> List<T> findByQueryString(String hql) {
		return commonDao.findByQueryString(hql);
	}

	/**
	 * 根据sql更新
	 *
	 * @return
	 */
	public int updateBySqlString(String sql) {
		return commonDao.updateBySqlString(sql);
	}

	/**
	 * 根据sql查找List
	 *
	 * @param <T>
	 * @param query
	 * @return
	 */
	/*public <T> List<T> findListbySql(String query) {
		return commonDao.findListbySql(query);
	}*/

	/**
	 * 通过属性称获取实体带排序
	 *
	 * @param <T>
	 * @return
	 */
	public <T> List<T> findByPropertyisOrder(Class<T> entityClass, String propertyName, Object value, boolean isAsc) {
		return commonDao.findByPropertyisOrder(entityClass, propertyName, value, isAsc);
	}

	/**
	 *
	 * cq方式分页
	 *
	 * @return
	 */
//	public PageList getPageList(final CriteriaQuery cq, final boolean isOffset) {
//		return commonDao.getPageList(cq, isOffset);
//	}
//
//	/**
//	 * 返回DataTableReturn模型
//	 *
//	 * @param cq
//	 * @param isOffset
//	 * @return
//	 */
//	public DataTableReturn getDataTableReturn(final CriteriaQuery cq, final boolean isOffset) {
//		return commonDao.getDataTableReturn(cq, isOffset);
//	}
//
//	/**
//	 * 返回easyui datagrid模型
//	 *
//	 * @param cq
//	 * @param isOffset
//	 * @return
//	 */
//	public DataGridReturn getDataGridReturn(final CriteriaQuery cq, final boolean isOffset) {
//		return commonDao.getDataGridReturn(cq, isOffset);
//	}
//
//	/**
//	 *
//	 * hqlQuery方式分页
//	 *
//	 * @param cq
//	 * @param isOffset
//	 * @return
//	 */
//	public PageList getPageList(final HqlQuery hqlQuery, final boolean needParameter) {
//		return commonDao.getPageList(hqlQuery, needParameter);
//	}
//
//	/**
//	 *
//	 * sqlQuery方式分页
//	 *
//	 * @param cq
//	 * @param isOffset
//	 * @return
//	 */
//	public PageList getPageListBySql(final HqlQuery hqlQuery, final boolean isToEntity) {
//		return commonDao.getPageListBySql(hqlQuery, isToEntity);
//	}

	public Session getSession()

	{
		return commonDao.getSession();
	}

	@SuppressWarnings("rawtypes")
	public List findByExample(final String entityName, final Object exampleEntity) {
		return commonDao.findByExample(entityName, exampleEntity);
	}

	/**
	 * 通过cq获取全部实体
	 *
	 * @param <T>
	 * @param cq
	 * @return
	 */
//	public <T> List<T> getListByCriteriaQuery(final CriteriaQuery cq,Boolean ispage) {
//		return commonDao.getListByCriteriaQuery(cq,ispage);
//	}

	/**
	 * 文件上传
	 *
	 * @param request
	 */
//	public <T> T  uploadFile(UploadFile uploadFile) {
//		return commonDao.uploadFile(uploadFile);
//	}
//
//	public HttpServletResponse viewOrDownloadFile(UploadFile uploadFile)
//
//	{
//		return commonDao.viewOrDownloadFile(uploadFile);
//	}


	/**
	 * 生成XML文件
	 *
	 *            XML全路径
	 * @return
	 */
//	public HttpServletResponse createXml(ImportFile importFile) {
//		return commonDao.createXml(importFile);
//	}
//
//	/**
//	 * 解析XML文件
//	 *
//	 * @param fileName
//	 *            XML全路径
//	 */
//	public void parserXml(String fileName) {
//		commonDao.parserXml(fileName);
//	}
//
//	public List<ComboTree> comTree(List<TSDepart> all, ComboTree comboTree) {
//		return commonDao.comTree(all, comboTree);
//	}
//
//	/**
//	 * 根据模型生成JSON
//	 *
//	 * @param all
//	 *            全部对象
//	 * @param in
//	 *            已拥有的对象
//	 * @param comboBox
//	 *            模型
//	 * @return
//	 */
//	public List<ComboTree> ComboTree(List all,ComboTreeModel comboTreeModel,List in) {
//		return commonDao.ComboTree(all,comboTreeModel,in);
//	}
//	/**
//	 * 构建树形数据表
//	 */
//	public List<TreeGrid> treegrid(List all, TreeGridModel treeGridModel) {
//		return commonDao.treegrid(all, treeGridModel);
//	}
//
//	/**
//	 * 获取自动完成列表
//	 *
//	 * @param <T>
//	 * @return
//	 */
//	public <T> List<T> getAutoList(Autocomplete autocomplete) {
//				StringBuffer sb = new StringBuffer("");
//		for(String searchField:autocomplete.getSearchField().split(",")){
//			sb.append("  or "+searchField+" like '%"+autocomplete.getTrem() + "%' ");
//		}
//		String hql = "from " + autocomplete.getEntityName() + " where 1!=1 " + sb.toString();
//		return commonDao.getSession().createQuery(hql).setFirstResult(autocomplete.getCurPage()-1).setMaxResults(autocomplete.getMaxRows()).list();
//			}


	@Override
	public Integer executeSql(String sql, List<Object> param) {
		return commonDao.executeSql(sql, param);
	}
	@Override
	public Integer executeSql(String sql, Object... param) {
		return commonDao.executeSql(sql, param);
	}
	@Override
	public List<Map<String, Object>> findForJdbc(String sql, int page, int rows) {
		return commonDao.findForJdbc(sql, page,rows);
	}
	@Override
	public List<Map<String, Object>> findForJdbc(String sql, Object... objs) {
		return commonDao.findForJdbc(sql, objs);
	}
	@Override
	public List<Map<String, Object>> findForJdbcParam(String sql, int page,
			int rows, Object... objs) {
		return commonDao.findForJdbcParam(sql, page, rows, objs);
	}
	@Override
	public <T> List<T> findObjForJdbc(String sql, int page, int rows,
			Class<T> clazz) {
		return commonDao.findObjForJdbc(sql, page, rows, clazz);
	}
	@Override
	public Map<String, Object> findOneForJdbc(String sql, Object... objs) {
		return commonDao.findOneForJdbc(sql, objs);
	}
	@Override
	public Long getCountForJdbc(String sql) {
		return commonDao.getCountForJdbc(sql);
	}
	@Override
	public Long getCountForJdbcParam(String sql, Object[] objs) {
		return commonDao.getCountForJdbc(sql);
	}
	@Override
	public <T> void batchSave(List<T> entitys) {
		this.commonDao.batchSave(entitys);
	}


	/**
	 * 通过hql 查询语句查找对象
	 *
	 * @param <T>
	 * @return
	 */
	public <T> List<T> findHql(String hql, Object... param) {
		return this.commonDao.findHql(hql, param);
	}
	@Override
	public void parserXml(String fileName) {
		// TODO Auto-generated method stub

	}

	@Override
	public <T> DataGrid<T> getDataGrid(Map<String, Object> params, PageHelper pageHelper, String hql) {
		DataGrid<T> dataGrid = new DataGrid();
		List<T> rows = commonDao.find(hql,pageHelper.getPage(),pageHelper.getRows(),params);
		dataGrid.setRows(rows);
		dataGrid.setTotal(commonDao.findHql(hql,params).size());
		return dataGrid;
	}

	@Override
	public Integer getAllDbTableSize() {
		// TODO Auto-generated method stub
		return null;
	}

    @Override
    public List<String> getProperty(Class entityName) {
        List<String> fields = this.commonDao.getProperty(entityName);
        return fields;
    }


    @Override
	public <T> List<T> findList(String hql, String keyWord,
			Integer currentPage, Integer numPerPage, String orderField,
			String orderDirection) throws Exception {
		return commonDao.findList(hql, keyWord, currentPage, numPerPage, orderField, orderDirection);
	}


	/*@Override
	public int getAllCount(String hql) throws Exception {
		// TODO Auto-generated method stub
		return commonDao.getAllCount(hql);
	}*/


	@Override
	public int getAllRowCount(String hql) {
		// TODO Auto-generated method stub
		return 0;
	}

	/*public PageBean queryForPage(String hql, int pageSize, int page) {
		int allRow = commonDao.getAllRowCount(hql);//总记录数
		int totalPage = PageBean.countTotalPage(pageSize, allRow);//总页数
		final int offset = PageBean.countOffset(pageSize, page);//当前页开始记录
		final int length = pageSize;//每页记录数
		final int currentPage = PageBean.countCurrentPage(page);
		List<?> list = commonDao.queryForPage(hql,offset, length);//"一页"的记录
		//把分页信息保存到Bean中
		PageBean pageBean = new PageBean();
		pageBean.setPageSize(pageSize);
		pageBean.setCurrentPage(currentPage);
		pageBean.setAllRow(allRow);
		pageBean.setTotalPage(totalPage);
		pageBean.setList(list);
		pageBean.init();
		return pageBean;
	}*/


	@Override
	public <T> void updateEntityById(Class entityName, Serializable id) {
		commonDao.updateEntityById(entityName, id);
	}


	@Override
	public <T> List<T> find(String hql, int page, int rows) {
		return commonDao.find(hql, page, rows);
	}

	@Override
	public <T> Set<T> findSet(String hql, int page, int rows) {
		return commonDao.findSet(hql, page, rows);
	}

	@Override
	public <T> List<T> find(String hql, int page, int rows,
			Map<String, Object> param) {
		return commonDao.find(hql, page, rows, param);
	}


	@Override
	public <T> List<T> findHql(String hql, Map<String, Object> param) {
		return commonDao.findHql(hql, param);
	}


	@Override
	public <T> T saveInsertRow(T entity) {
		commonDao.saveInsertRow(entity);
		return entity;
	}


	@Override
	public Integer executeHql(String hql) {
		return commonDao.executeHql(hql);
	}


	@Override
	public <T> T updateRow(T entity) {
		return commonDao.updateRow(entity);
	}

    @Override
    public <T> T updateRow4merge(T entity) {
        return commonDao.updateRow4merge(entity);
    }


    @Override
	public PageBean queryForPage(String hql, int pageSize, int page, Map<String, Object> param) {
		int allRow = commonDao.countAll1(hql,param);//总记录数
		int totalPage = PageBean.countTotalPage(pageSize, allRow);//总页数
		final int offset = PageBean.countOffset(pageSize, page);//当前页开始记录
		final int length = pageSize;//每页记录数
		final int currentPage = PageBean.countCurrentPage(page);
		List<?> list = commonDao.find4pre(hql,offset, length,param);//"一页"的记录
		//把分页信息保存到Bean中
		PageBean pageBean = new PageBean();
		pageBean.setPageSize(pageSize);
		pageBean.setCurrentPage(currentPage);
		pageBean.setAllRow(allRow);
		pageBean.setTotalPage(totalPage);
		pageBean.setList(list);
		pageBean.init();
		return pageBean;
	}



}
